from langchain_openai import ChatOpenAI
import datetime
from langchain.tools import tool


# 构建deepseek大模型客户端
llm = ChatOpenAI(
    model="deepseek-chat",
    base_url="https://api.deepseek.com/v1",
    openai_api_key="sk-ddad02a64c4c47ea9f6f526ef47cb602",
)


@tool(description="规划行车路线")
def get_route_plan(origin_city: str, target_city: str):
    """
    规划从出发城市到目标城市的行车路线。

    Args:
        origin_city (str): 出发城市名称。
        target_city (str): 目标城市名称。

    Returns:
        str: 行车路线规划结果的描述信息。
    """
    result = f"从城市 {origin_city} 出发，到目标城市 {target_city} , 使用意念传送，只需要三分钟即可到达。"
    print(">>>> get_route_plan >>>>>" + result)
    return result


# 大模型绑定工具
llm_with_tools = llm.bind_tools([get_route_plan])

# 工具容器：用于根据工具名称查找对应的工具函数
all_tools = {"get_route_plan": get_route_plan}

# 将用户查询消息保存为列表形式，便于后续扩展多轮对话
query = "帮我规划一条从长沙到桂林的自驾路线"
messages = [query]

# 调用大模型进行推理，判断是否需要调用工具并返回工具调用请求
ai_msg = llm_with_tools.invoke(messages)
print(ai_msg)

# 将模型返回的消息追加到消息历史中
messages.append(ai_msg)

# 输出模型识别出的工具调用信息
print(ai_msg.tool_calls)

# 处理AI消息中的工具调用
# 遍历所有需要调用的工具，执行工具调用并将结果添加到消息列表中
if ai_msg.tool_calls:
    # 遍历每个工具调用请求
    for tool_call in ai_msg.tool_calls:
        # 根据工具名称获取对应的工具实例（名称转为小写进行匹配）
        selected_tool = all_tools[tool_call["name"].lower()]
        # 执行工具调用，获取工具执行结果消息
        tool_msg = selected_tool.invoke(tool_call)
        # 将工具执行结果消息添加到消息列表中
        messages.append(tool_msg)


# 最终调用模型生成自然语言回复内容
res = llm_with_tools.invoke(messages).content
print(res)
